@echo off
chcp 65001 >nul 2>&1
setlocal enabledelayedexpansion

echo ========================================
echo     SpringBoot启动问题诊断脚本
echo ========================================
echo 版本: 1.0.0
echo 专门用于诊断SpringBoot应用启动失败问题
echo ========================================
echo.

set "error_count=0"
set "fix_count=0"

:: 创建日志文件
set "log_file=logs\startup-diagnostics-%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%%time:~6,2%.log"
if not exist "logs" mkdir "logs"
echo [%date% %time%] 开始启动问题诊断 > "%log_file%"

echo [1/6] 分析应用启动日志...
echo [%date% %time%] 分析应用启动日志 >> "%log_file%"

:: 查找最新的启动日志
set "startup_log="
if exist "backend\logs\employment.log" (
    set "startup_log=backend\logs\employment.log"
) else if exist "backend\logs\employment-dev.log" (
    set "startup_log=backend\logs\employment-dev.log"
) else if exist "logs\employment.log" (
    set "startup_log=logs\employment.log"
)

if defined startup_log (
    echo ✅ 找到启动日志文件: %startup_log%
    echo [INFO] 找到启动日志文件: %startup_log% >> "%log_file%"
    
    echo    正在分析错误信息...
    
    :: 检查常见错误模式
    findstr /i "Exception\|Error\|Failed\|Cannot\|Unable" "%startup_log%" > temp_errors.txt 2>nul
    if exist temp_errors.txt (
        set /a error_count+=1
        echo    ❌ 发现以下错误信息:
        echo [ERROR] 发现启动错误 >> "%log_file%"
        type temp_errors.txt
        type temp_errors.txt >> "%log_file%"
        del temp_errors.txt
    ) else (
        echo    ✅ 未发现明显错误信息
        echo [INFO] 未发现明显错误信息 >> "%log_file%"
    )
) else (
    echo ⚠️  未找到启动日志文件
    echo [WARN] 未找到启动日志文件 >> "%log_file%"
)

echo.
echo [2/6] 检查依赖冲突...
echo [%date% %time%] 检查依赖冲突 >> "%log_file%"

cd /d "%~dp0..\backend" 2>nul
if %ERRORLEVEL% equ 0 (
    echo    正在分析Maven依赖树...
    mvn dependency:tree > ..\temp_dependency_tree.txt 2>&1
    if %ERRORLEVEL% equ 0 (
        echo ✅ Maven依赖树生成成功
        echo [INFO] Maven依赖树生成成功 >> "..\%log_file%"
        
        :: 检查常见的依赖冲突
        findstr /i "conflict\|duplicate\|version" ..\temp_dependency_tree.txt > ..\temp_conflicts.txt 2>nul
        if exist ..\temp_conflicts.txt (
            set /a error_count+=1
            echo    ❌ 检测到可能的依赖冲突:
            echo [ERROR] 检测到依赖冲突 >> "..\%log_file%"
            type ..\temp_conflicts.txt
            type ..\temp_conflicts.txt >> "..\%log_file%"
            del ..\temp_conflicts.txt
        ) else (
            echo    ✅ 未发现明显的依赖冲突
            echo [INFO] 未发现明显的依赖冲突 >> "..\%log_file%"
        )
        del ..\temp_dependency_tree.txt
    ) else (
        echo ❌ Maven依赖分析失败
        echo [ERROR] Maven依赖分析失败 >> "..\%log_file%"
        set /a error_count+=1
    )
    cd ..
) else (
    echo ❌ 无法进入backend目录
    echo [ERROR] 无法进入backend目录 >> "%log_file%"
    set /a error_count+=1
)

echo.
echo [3/6] 验证配置文件...
echo [%date% %time%] 验证配置文件 >> "%log_file%"

:: 检查主配置文件
if exist "backend\src\main\resources\application.yml" (
    echo ✅ application.yml 存在
    echo [INFO] application.yml 存在 >> "%log_file%"
    
    :: 简单的YAML语法检查
    findstr /r /c:"^[[:space:]]*[^#[:space:]].*:.*[^[:space:]]$" "backend\src\main\resources\application.yml" >nul
    if %ERRORLEVEL% equ 0 (
        echo    ✅ YAML语法看起来正常
        echo [INFO] YAML语法看起来正常 >> "%log_file%"
    ) else (
        echo    ⚠️  YAML语法可能存在问题
        echo [WARN] YAML语法可能存在问题 >> "%log_file%"
    )
) else (
    echo ❌ application.yml 不存在
    echo [ERROR] application.yml 不存在 >> "%log_file%"
    set /a error_count+=1
)

:: 检查开发环境配置文件
if exist "backend\src\main\resources\application-dev.yml" (
    echo ✅ application-dev.yml 存在
    echo [INFO] application-dev.yml 存在 >> "%log_file%"
) else (
    echo ⚠️  application-dev.yml 不存在，使用默认配置
    echo [WARN] application-dev.yml 不存在 >> "%log_file%"
)

echo.
echo [4/6] 检查数据库连接...
echo [%date% %time%] 检查数据库连接 >> "%log_file%"

:: 从配置文件中提取数据库信息
set "db_host=localhost"
set "db_port=3306"
set "db_user=root"
set "db_password=123456"

echo    尝试连接数据库 %db_host%:%db_port%...
mysql -h %db_host% -P %db_port% -u %db_user% -p%db_password% -e "SELECT 1;" >nul 2>&1
if %ERRORLEVEL% equ 0 (
    echo ✅ 数据库连接成功
    echo [INFO] 数据库连接成功 >> "%log_file%"
    
    :: 检查数据库是否存在
    mysql -h %db_host% -P %db_port% -u %db_user% -p%db_password% -e "USE employment_db; SELECT 1;" >nul 2>&1
    if %ERRORLEVEL% equ 0 (
        echo    ✅ employment_db 数据库已存在
        echo [INFO] employment_db 数据库已存在 >> "%log_file%"
    ) else (
        echo    ❌ employment_db 数据库不存在
        echo [ERROR] employment_db 数据库不存在 >> "%log_file%"
        set /a error_count+=1
        
        echo    是否创建数据库? (Y/N)
        set /p create_db=
        if /i "!create_db!"=="Y" (
            mysql -h %db_host% -P %db_port% -u %db_user% -p%db_password% -e "CREATE DATABASE employment_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" >nul 2>&1
            if %ERRORLEVEL% equ 0 (
                echo    ✅ 成功创建 employment_db 数据库
                echo [INFO] 成功创建 employment_db 数据库 >> "%log_file%"
                set /a fix_count+=1
            ) else (
                echo    ❌ 创建数据库失败
                echo [ERROR] 创建数据库失败 >> "%log_file%"
            )
        )
    )
) else (
    echo ❌ 数据库连接失败
    echo [ERROR] 数据库连接失败 >> "%log_file%"
    echo    请检查:
    echo    1. MySQL服务是否启动
    echo    2. 用户名密码是否正确
    echo    3. 防火墙设置
    set /a error_count+=1
)

echo.
echo [5/6] 检查JVM和内存设置...
echo [%date% %time%] 检查JVM和内存设置 >> "%log_file%"

:: 检查Java版本
for /f "tokens=3" %%a in ('java -version 2^>^&1 ^| findstr "version"') do (
    set java_ver=%%a
    set java_ver=!java_ver:"=!
)

echo    当前Java版本: %java_ver%
echo [INFO] 当前Java版本: %java_ver% >> "%log_file%"

:: 检查可用内存
for /f "skip=1 tokens=4" %%a in ('wmic OS get TotalVisibleMemorySize /value') do (
    if defined %%a (
        set /a total_memory=%%a/1024
        if !total_memory! lss 2048 (
            echo ⚠️  系统内存较低 (!total_memory! MB)，可能影响应用启动
            echo [WARN] 系统内存较低 >> "%log_file%"
        ) else (
            echo ✅ 系统内存充足 (!total_memory! MB)
            echo [INFO] 系统内存充足 >> "%log_file%"
        )
    )
)

echo.
echo [6/6] 生成修复建议...
echo [%date% %time%] 生成修复建议 >> "%log_file%"

echo ========================================
echo            诊断结果报告
echo ========================================
echo 发现问题: %error_count% 个
echo 自动修复: %fix_count% 个
echo 日志文件: %log_file%
echo ========================================
echo.

echo [%date% %time%] 诊断完成 >> "%log_file%"
echo [SUMMARY] 发现问题: %error_count%, 自动修复: %fix_count% >> "%log_file%"

if %error_count% gtr 0 (
    echo ❌ 发现 %error_count% 个问题需要解决
    echo.
    echo 修复建议:
    echo 1. 检查启动日志中的具体错误信息
    echo 2. 确保所有依赖项版本兼容
    echo 3. 验证数据库连接配置
    echo 4. 检查端口是否被占用
    echo 5. 增加JVM内存设置（如需要）
    echo.
    echo 常用修复命令:
    echo - 清理重新构建: mvn clean install
    echo - 刷新依赖: mvn dependency:resolve -U
    echo - 重启MySQL: net restart mysql
    echo - 检查端口: netstat -ano ^| findstr :8080
    echo.
) else (
    echo ✅ 未发现明显问题，应用应该可以正常启动
    echo.
    set /p retry_start="是否尝试重新启动应用? (Y/N): "
    if /i "!retry_start!"=="Y" (
        echo 正在启动应用...
        cd backend
        mvn spring-boot:run -Dspring-boot.run.profiles=dev
    )
)

echo.
echo 如需更详细的诊断信息，请查看日志文件: %log_file%
pause